www.gusucode.com > MIMO与SISO仿真程序 > MIMO-OFDM/all code/MIMO_v9_3_2x1_STBC_offset.m

    clc; clear all; close all

data = 2^16;                                    % data points

n_fft = 64;                                     % fft size
    
n_cp = 16;                                      % cyclic prefix

snr = [0:1:35];
errors = zeros(size(snr));
ber = zeros(size(snr));
OFDM = n_fft+n_cp;
%%
binary_data = round(rand(data,1));              % generate data

h = [randn()+randn()*1i; randn()+randn()*1i];
%%
for mod_value = 1:3
% bits per symbol
if mod_value == 1
    symbols = 2;   
elseif mod_value == 2
    symbols = 4;
else 
    symbols = 6;
    while floor(length(binary_data)/symbols) ~= length(binary_data)/symbols
    binary_data = [binary_data; zeros(1,1)];                                    %padding for symbol mapping
    end
    while floor(length(binary_data)/symbols/n_fft) ~= length(binary_data)/symbols/n_fft
    binary_data = [binary_data; zeros(6,1)];                                    %padding for subcarriers mapping
    end
end

mod_method = 2^symbols;       
                                                
mod_data = qammod(binary_data,mod_method,'unitaveragepower',true,'inputtype','bit');
%mod_data = mod_data./abs(mod_data);
%% STBC
% [x1 -x2* ; x2 x1*]
STBC = zeros(2*length(mod_data),1);
for i = 0:(length(mod_data)/2-1)
    STBC(4*i+1) = mod_data(2*i+1);
    STBC(4*i+2) = mod_data(2*i+2);
    STBC(4*i+3) = -conj(mod_data(2*i+2));
    STBC(4*i+4) = conj(mod_data(2*i+1));
end

STBC = reshape(STBC.',2,length(mod_data));
%% splitting up the data between the transmitters
Tx1 = STBC(1,:);
Tx2 = STBC(2,:);

% while floor(length(Tx1)/64) ~= length(Tx1)/64
%     Tx1 = [Tx1 zeros(1,1)];
%     Tx2 = [Tx2 zeros(1,1)];
% end


%% IFFT
Xk1 = reshape(Tx1,n_fft,length(Tx1)/n_fft);
Xk2 = reshape(Tx2,n_fft,length(Tx2)/n_fft);

Xn1 = ifft(Xk1);
Xn2 = ifft(Xk2);
%% Cyclic prefix
Xn1_cp = [Xn1((end - n_cp + 1):end,:);Xn1];  
Xn2_cp = [Xn2((end - n_cp + 1):end,:);Xn2]; 

%% P/S
xn1 = Xn1_cp(:);
xn2 = Xn2_cp(:);
%% Channel

for k = 1:length(snr)
yn11 = xn1*h(1);            % y time, receiver 
yn21 = xn2*h(2);

% add noise

yn11 = awgn(yn11,snr(k),'measured');
yn21 = awgn(yn21,snr(k),'measured');

%% Delay added
delay11 = 19;
delay21 = 16;
% adding delay to first transmitter


% yn11 = [zeros(delay,1);yn11];
% yn21 = [yn21; zeros(delay,1)];
for i = 0:(length(yn11)/(OFDM))-2
    
    if delay11 ~= 0
    yn11(1+OFDM+OFDM*i:1+OFDM+delay11+OFDM*i) = yn11(1+OFDM+OFDM*i:1+OFDM+delay11+OFDM*i) ...
        + yn11(OFDM-delay11+OFDM*i:OFDM+OFDM*i);
    end
    if delay21 ~= 0
    yn21(1+OFDM+OFDM*i:1+OFDM+delay21+OFDM*i) = yn21(1+OFDM+OFDM*i:1+OFDM+delay21+OFDM*i) ...
        + yn21(OFDM-delay21+OFDM*i:OFDM+OFDM*i);
    end

end

if delay11 ~= 0
yn11(1:OFDM) = [zeros(delay11+1,1);yn11(1:OFDM-delay11-1)];      
end
if delay21 ~= 0
yn21(1:OFDM) = [zeros(delay21+1,1);yn21(1:OFDM-delay21-1)];  
end



% superposition of two received signals at receiver
yn1 = yn11 + yn21;                    % y(1) = h1*x1 + h2*x2 ; y(2) = -h2* x1* + h1 * x2*
% yn1 = yn1(1:end-delay);
%% S/P
yn1_sp = reshape(yn1,n_fft+n_cp,length(Xn1_cp));

%% remove cyclic prefix
yn1_rcp = yn1_sp((n_cp + 1):end,:);


%% DFT
Yk1_block = fft(yn1_rcp);


Yk1 = Yk1_block(:);              % transform 64 subchannels back into 1 stream


%% STBC decoding
abs_h = sum(sum(abs(h).^2));
% assume perfect channel estimation
H = [ conj(h(1)) , h(2),; ...         % pseudo inverse
    conj(h(2)), -h(1)]./ abs_h;

X_hat1 = zeros(length(Tx1)/2,1);
X_hat2 = zeros(length(Tx2)/2,1);

X = zeros(length(Tx1)/2,1);

for i = 0:length(Yk1)/2-1
Yk1(2*i+2) = conj(Yk1(2*i+2));

X_hat1(i+1) = H(1,1)*Yk1(2*i+1) + H(1,2)*Yk1(2*i+2);       
X_hat2(i+1) = H(2,1)*Yk1(2*i+1) + H(2,2)*Yk1(2*i+2);

X(2*i+1) = X_hat1(i+1);
X(2*i+2) = X_hat2(i+1);

end

%% demodulate
X_demod = qamdemod(X,mod_method,'unitaveragepower',true,'outputtype','bit');
%output = reshape(X_demod.',size(binary_data));
output = X_demod(:).';
%%

errors(mod_value,k) = 0;
for i = 1:length(binary_data)-n_fft*symbols
    if X_demod(i+n_fft*symbols) ~= binary_data(i+n_fft*symbols)
        errors(mod_value,k) = errors(mod_value,k) + 1;
    end
end
ber(mod_value,k) = errors(mod_value,k)/length(binary_data);

end

semilogy(snr-10*log10(symbols),ber(mod_value,:),'-');
title('STBC for 2x1 system'); legend('4QAM','16QAM','64QAM');
xlabel('SNR'); ylabel('BER'); grid on; hold on
end